package com.itheima.project.pojo;

import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author sjqn
 * @date 2023/9/1
 */
@Data  // Lombok 注解，自动生成 getter、setter、toString、equals、hashCode 等方法
public class UserAuth implements UserDetails {

    private String username; // 固定不可更改，用户的唯一标识（如用户名）
    private String password; // 固定不可更改，用户的密码
    private String nickName; // 扩展属性，用户的昵称
    private List<String> roles; // 角色列表，定义用户的权限范围

    /**
     * 获取当前用户的角色权限
     * @return 返回角色对应的权限集合，前缀 "ROLE_" 是 Spring Security 的惯例
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        if (roles == null) return null;  // 如果没有角色，返回 null
        // 将角色名转换为 SimpleGrantedAuthority，并加上 "ROLE_" 前缀，符合 Spring Security 的角色命名规范
        return roles.stream()
                .map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                .collect(Collectors.toList());
    }

    /**
     * 判断账户是否过期
     * @return true 表示账户永不过期
     */
    @Override
    public boolean isAccountNonExpired() {
        return true;  // 默认不考虑账户过期
    }

    /**
     * 判断账户是否被锁定
     * @return true 表示账户未被锁定
     */
    @Override
    public boolean isAccountNonLocked() {
        return true;  // 默认不考虑账户被锁定
    }

    /**
     * 判断密码是否过期
     * @return true 表示密码永不过期
     */
    @Override
    public boolean isCredentialsNonExpired() {
        return true;  // 默认不考虑密码过期
    }

    /**
     * 判断账户是否启用
     * @return true 表示账户已启用
     */
    @Override
    public boolean isEnabled() {
        return true;  // 默认账户始终启用
    }
}
